home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / js / proxyScripts-src.js < prev    next >
Text File  |  2010-05-19  |  18KB  |  442 lines

  1. if(parent.updateURL) parent.updateURL();
  2. // Processed javascript attributes
  3. var proxyJsAttr=new Array('ONCLICK', 'ONMOUSEOVER', 'ONMOUSEOUT', 'ONDBLCLICK', 'ONLOAD', 'ONRESIZE', 'ONABORT', 'ONBLUR', 'ONCHANGE', 'ONERROR', 'ONFOCUS', 'ONKEYDOWN', 'ONKEYPRESS', 'ONKEYUP','ONMOUSEDOWN', 'ONMOUSEUP', 'ONMOUSEMOVE', 'ONRESET', 'ONSELECT', 'ONSUBMIT', 'ONUNLOAD');
  4. // Processed adress or javascript attributes
  5. var proxyLinkAttr=new Array('HREF', 'SRC', 'ACTION');
  6. // trim function
  7. String.prototype.trim = function(){return this.replace(/^\s+|\s+$/,'');};
  8. function proxyDgi(id){return document.getElementById(id);}
  9. // Base 64 encoding
  10. var proxyDtable = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','.','_');
  11. function proxyB64IC(d) {r = -1; for (var proxyi = 0; proxyi < proxyDtable.length; proxyi++) {if (d == proxyDtable[proxyi]) {r = proxyi;break;}} return r;}
  12. function proxyB64F(n) {while (n > 256) { n -= 256; } return n;}
  13. function proxyB64Enc(n) {
  14.   var o1 = o2 = o3 =o4 = 0;
  15.   var text = "";
  16.   proxyj = 0;
  17.   for (var proxyi = 0; proxyi < n.length; proxyi += 3) {
  18.     t = Math.min(3, n.length - proxyi);
  19.     if (t == 1) {x = n.charCodeAt(proxyi);       text += proxyDtable[(x >> 2)];       text += proxyDtable[((x & 0X00000003) << 4)];       text += '-';       text += '-';}
  20.     else if (t == 2) {x = n.charCodeAt(proxyi);y = n.charCodeAt(proxyi+1);text += proxyDtable[(x >> 2)];text += proxyDtable[((x & 0X00000003) << 4) | (y >> 4)];text += proxyDtable[((y & 0X0000000f) << 2)];text += '-';}
  21.     else {x = n.charCodeAt(proxyi);y = n.charCodeAt(proxyi+1);z = n.charCodeAt(proxyi+2);text += proxyDtable[x >> 2];text += proxyDtable[((x & 0x00000003) << 4) | (y >> 4)];text += proxyDtable[((y & 0X0000000f) << 2) | (z >> 6)];text += proxyDtable[z & 0X0000003f];}
  22.   }
  23.   return text;
  24. }
  25.  
  26. // Decode a proxy-encoded URL
  27. function proxyDecodeURL(encoded) {
  28.     // If URL is not encoded, return
  29.     if(encoded.indexOf('/proxyBrowser')==-1) return encoded;
  30.     var n=encoded.substr(14+encoded.indexOf('/proxyBrowser'));
  31.     n=n.substr(0,n.indexOf('/eourl/')).replace(/\//,'');
  32.   var p;  var o1 = o2 = o3 = 0; var text = ""; proxyj = 0;
  33.   if ((n.length % 4) != 0) return null;
  34.   for (var proxyi = 0; proxyi < n.length; proxyi += 4) {
  35.     x1 = proxyB64IC(n.charAt(proxyi));    x2 = proxyB64IC(n.charAt(proxyi+1));    x3 = proxyB64IC(n.charAt(proxyi+2));    x4 = proxyB64IC(n.charAt(proxyi+3));    ol = 4;    if (x4 == -1) { ol--; x4 = 0;}    if (x3 == -1) { ol--; x3 = 0;}
  36.     if (ol == 4) {
  37.       o1 = ((x1 << 2) | (x2 >> 4)); ((o1 > 256) ? p=proxyB64F(o1) : p=o1) ; text += String.fromCharCode(p);
  38.       o2 = ((x2 << 4) | (x3 >> 2)); ((o2 > 256) ? p=proxyB64F(o2) : p=o2) ; text += String.fromCharCode(p);
  39.       o3 = ((x3 << 6) | x4); ((o3 > 256) ? p=proxyB64F(o3) : p=o3) ; text += String.fromCharCode(p);
  40.     } else if (ol == 3) {
  41.       o1 = ((x1 << 2) | (x2 >> 4)); ((o1 > 256) ? p=proxyB64F(o1) : p=o1) ; text += String.fromCharCode(p);
  42.       o2 = ((x2 << 4) | (x3 >> 2)); ((o2 > 256) ? p=proxyB64F(o2) : p=o2); text += String.fromCharCode(p);
  43.           } else if (ol == 2) {
  44.       o1 = ((x1 << 2) | (x2 >> 4)); ((o1 > 256) ? p=proxyB64F(o1) : p=o1) ; text += String.fromCharCode(p);
  45.     }
  46.   }
  47.   return text;
  48. }
  49. /**
  50.  * Encode an URL into proxy format
  51.  * url: real URL to encode
  52.  * forceAbsolute: true to indicate that URL must include protocol+host (used by index.php wrapper)
  53.  */
  54. function proxyEncodeURL(url,forceAbsolute){
  55.     // If URL is already encoded, do nothing
  56.     if(!url || url.substr(0,baseURLProxy.length)==baseURLProxy) return url;
  57.  
  58.     // "javascript url"
  59.     if(url.substr(0,11).toLowerCase()=='javascript:') return 'javascript:'+proxyProcessJS(url.substr(11));
  60.  
  61.     if(url.substr(0,2)=='//') url=siteHref.protocol+':'+url;
  62.     if(url.substr(0,7).toLowerCase()!='http://' && url.substr(0,8).toLowerCase()!='https://'){
  63.         if(forceAbsolute) {url='http://'+url;}
  64.         // If a <base> tag is present
  65.         else if(proxyBaseHref && url.substr(0,1)!='/') {
  66.             url=proxyBaseHref+url;
  67.         }
  68.         else {
  69.             var loc=siteHref.href;
  70.             var siteHost=((loc.indexOf('/',9)>0)?loc.substr(0,loc.indexOf('/',9)):loc);
  71.             var tmp=((loc.indexOf('?',9)>0)?loc.substr(0,loc.indexOf('?',9)):loc);
  72.             var siteHostPath=((tmp.lastIndexOf('/')>8)?tmp.substr(0,tmp.lastIndexOf('/')):tmp);
  73.             siteHostDoc=tmp.substr(0,siteHostPath.length+1);
  74.             if(url.substr(0,1)=='/') url=siteHost+url; else url=siteHostPath+'/'+url;
  75.         }
  76.     }
  77.     var siteHostDoc=((url.lastIndexOf('/')>8)?url.substr(url.lastIndexOf('/')+1):'');
  78.     if(siteHostDoc.indexOf('?')>=0) siteHostDoc=siteHostDoc.substr(0,siteHostDoc.indexOf('?'));
  79.     var b64='';
  80.     url=proxyB64Enc(url);
  81.     while(url.length>254) {
  82.         b64+=url.substr(0,254)+'/';
  83.         url=url.substr(254);
  84.     }
  85.     return baseURLProxy+b64+url+'//eourl/a'+siteHostDoc;
  86. }
  87.  
  88. function sExp(script){
  89.     var stack='';
  90.     var lastStack='';
  91.     var inquote=false;
  92.     var sp=0;
  93.     var prevc='';
  94.     while(sp<script.length){
  95.         c=script.charAt(sp);
  96.         if(!inquote){
  97.             if(!stack && (c==','||c==';'||c=="\n"||c=="\r"||c==')'||c=='}'||c==']')) {
  98.                 break;
  99.             }
  100.             else{
  101.                 if((c==')' && lastStack=='(') || (c=='}' && lastStack=='{') || (c==']' && lastStack=='[')){
  102.                     stack=stack.substr(0,stack.length-1);
  103.                     lastStack=stack.substr(stack.length-1);
  104.                 }
  105.                 else if(c=='(' || c=='{' || c=='[') {lastStack=c;stack+=c;}
  106.                 else if(c=="'") inquote=1;
  107.                 else if(c=='"') inquote=2;
  108.                 else if(c=='/' && prevc=='/') inquote=3;
  109.                 else if(c=='*' && prevc=='/') inquote=4;
  110.             }
  111.         }
  112.         else{
  113.             if(((inquote==1 && c=="'") || (inquote==2 && c=='"')) && prevc!='\\') inquote=0;
  114.             else if(inquote==3 && ((c=="\n" || c=="\r") || (c=="/" && prevc=='/'))) inquote=0;
  115.             else if(inquote==4 && c=="/" && prevc=='*') inquote=0;
  116.         }
  117.         prevc=c;
  118.         sp++;
  119.     }
  120.     return (script.substr(0,sp));
  121. }
  122.  
  123. function sExpR(script,pos){
  124.     var stack='';
  125.     var lastStack='';
  126.     var inquote=false;
  127.     var sp=pos;
  128.     var prevc='';
  129.     var del=";,{}\n\r+-=*!:?|&/><]([";
  130.     while(sp>0){
  131.         c=script.charAt(sp);
  132.         prevc=script.charAt(sp-1);
  133.         //document.write(c+' stack:'+stack+" inquote:"+inquote+'<br>')
  134.         if(!inquote){
  135.             if(!stack && del.indexOf(c)!=-1) break;
  136.             else{
  137.                 if((c=='(' && lastStack==')') || (c=='{' && lastStack=='}') || (c=='[' && lastStack==']')){
  138.                     stack=stack.substr(0,stack.length-1);
  139.                     lastStack=stack.substr(stack.length-1);
  140.                 }
  141.                 else if(c==')' || c=='}' || c==']') {lastStack=c;stack+=c;}
  142.                 else if(c=="'" && prevc!='\\') inquote=1;
  143.                 else if(c=='"' && prevc!='\\') inquote=2;
  144.             }
  145.         }
  146.         else{
  147.             if(((inquote==1 && c=="'") || (inquote==2 && c=='"')) && prevc!='\\') inquote=0;
  148.         }
  149.         sp--;
  150.     }
  151.     return (script.substring(sp+1,pos));
  152. }
  153.  
  154. // Process javascript section
  155. function proxyProcessJS(txt){
  156.     if(!txt) return txt;
  157.     txt+=""; // cast into String
  158.     txt=txt.replace(/eval\s*\(/g,' proxyEval(') /* '*/
  159.     txt=txt.replace(/document\s*.\s*writeln\(/g,'proxyDocumentWriteln(');
  160.     txt=txt.replace(/document\s*.\s*write\(/g,'proxyDocumentWrite(');
  161.     txt=txt.replace(/window\s*.\s*open\s*\(/g,'proxyWindowOpen(');
  162.  
  163.     // Transform +=
  164.     var processed='';
  165.     while((pos=txt.search(/\.\s*((src)|(href)|(action))\s*\+=/))!=-1){
  166.         pos2=txt.indexOf('+',pos+4);pos3=txt.indexOf('=',pos+4)
  167.         s=sExpR(txt,pos);
  168.         expr=s+txt.substring(pos,pos2);
  169.         processed=txt.substr(0,pos-s.length)+expr+"="+expr+'+';
  170.         txt=txt.substr(pos3+1);
  171.     }
  172.     txt=processed+txt;
  173.  
  174.     // process src/href/action not followed by "=": put in proxyDecodeURL()
  175.     var processed='';
  176.     while((pos=txt.search(/\.\s*(((src)|(href)|(action))\s*[^=\s])/))!=-1) /* */{
  177.         pos++;
  178.         s=sExpR(txt,pos);
  179.         processed+=txt.substr(0,pos-s.length);
  180.  
  181.         while(txt.charAt(pos)==' ' || txt.charAt(pos)=="\t") pos++;
  182.         if(txt.charAt(pos)=='s') {pos+=3;s+='src'}
  183.         else if(txt.charAt(pos)=='h') {pos+=4;s+='href'}
  184.         else {pos+=6;s+='action'}
  185.  
  186.         processed+='proxyDecodeURL('+s+')';
  187.         txt=txt.substr(pos);
  188.     }
  189.     txt=processed+txt;
  190.  
  191.     // process src/href/action =
  192.     processed='';
  193.     while((pos=txt.search(/(\.\s*(src)|(href)|(action)\s*)=/))!=-1) /* */{
  194.         pos=txt.indexOf('=',pos);
  195.         processed+=txt.substr(0,pos+1);
  196.         txt=txt.substr(pos+1);
  197.         s=sExp(txt);
  198.         processed+='proxyEncodeURL('+s+')';
  199.         txt=txt.substr(s.length);
  200.     }
  201.     txt=processed+txt;
  202.  
  203.     // process .innerHTML
  204.     processed='';
  205.     while((pos=txt.search(/\.\s*innerHTML\s*=/))!=-1) /* */ {
  206.         pos=txt.indexOf('=',pos);
  207.         processed+=txt.substr(0,pos+1);
  208.         txt=txt.substr(pos+1);
  209.         s=sExp(txt);
  210.         processed+='proxyJSProcessHTML('+s+')';
  211.         txt=txt.substr(s.length);
  212.     }
  213.     txt=processed+txt;
  214.     return txt;
  215. }
  216.  
  217. // CSS processing
  218. function proxyProcessCSS(txt){
  219.     processed='';
  220.     while((pos=txt.search(/url\s*\(/i))!=-1) /* */ {
  221.         pos=txt.indexOf('(',pos);
  222.         processed+=txt.substr(0,pos+1);
  223.         txt=txt.substr(pos+1);
  224.         s=sExp(txt);
  225.         processed+=proxyEncodeURL(s)+')';
  226.         txt=txt.substr(s.length);
  227.     }
  228.     txt=processed+txt;
  229.     return txt;
  230. }
  231.  
  232. function proxyProcessNode(node){
  233.     var attr;
  234.     // Process onclick, onmouse...
  235.     for(var proxyi=0;proxyi<proxyJsAttr.length;proxyi++) {
  236.         if((attr=node.getAttribute(proxyJsAttr[proxyi]))!==null) {
  237.             attr=attr.toString();
  238.             node.removeAttribute(proxyJsAttr[proxyi]); // IE Workaround
  239.             node.setAttribute(proxyJsAttr[proxyi].toUpperCase(),proxyProcessJS(attr));
  240.         }
  241.     }
  242.  
  243.     // Process href, src, action
  244.     for(proxyi=0;proxyi<proxyLinkAttr.length;proxyi++) {
  245.         if((attr=node.getAttribute(proxyLinkAttr[proxyi]))!==null){
  246.             node.removeAttribute(proxyLinkAttr[proxyi]); // IE Workaround
  247.             if(attr.toLowerCase().substr(0,11)=='javascript:') node.setAttribute(proxyLinkAttr[proxyi],'javascript:'+proxyProcessJS(attr.substr(11)));
  248.             else {
  249.                 node.setAttribute(proxyLinkAttr[proxyi].toUpperCase(),proxyEncodeURL(attr));
  250.             }
  251.         }
  252.     }
  253.     // Process style
  254.     if((attr=node.getAttribute('STYLE'))!==null) {
  255.         attr=attr.toString();
  256.         node.removeAttribute('STYLE'); // IE Workaround
  257.         node.setAttribute('STYLE',proxyProcessCSS(attr));
  258.     }
  259.  
  260.     // Process <script> nodes
  261.     if(node.nodeName.toLowerCase()=='script'){
  262.         //alert('script:'+node.innerHTML+'>'+proxyProcessJS(node.innerHTML))
  263.         node.nodeValue=proxyProcessJS(node.innerHTML)
  264.     }
  265.     //for(proxyi=0;proxyi<node.childNodes.length;proxyi++) alert(node.childNodes[proxyi].nodeType+" "+node.childNodes[proxyi].nodeName);
  266.     for(proxyi=0;proxyi<node.childNodes.length;proxyi++) if(node.childNodes[proxyi].nodeType==1) proxyProcessNode(node.childNodes[proxyi]);
  267. }
  268. // Process HTML code
  269. function proxyJSProcessHTML(txt){
  270.     txt+="";
  271.     if(!proxyDgi('proxyDWDOM'))    document.write('<div id="proxyDWDOM" style="display:none"></div>')
  272.     if(!proxyDgi('proxyDWDOM'))    {
  273.         var proxyDWDOMNode=document.createElement("div");
  274.         proxyDWDOMNode.setAttribute("id","proxyDWDOM");
  275.         proxyDWDOMNode.setAttribute("style","display:none");
  276.         try{document.lastChild.appendChild(proxyDWDOMNode);}
  277.         catch(err){alert('Proxy: cannot create proxyDWDOM node')}
  278.     }
  279.     proxyDgi('proxyDWDOM').innerHTML=txt;
  280.     proxyProcessNode(proxyDgi('proxyDWDOM'));
  281.     txt=proxyDgi('proxyDWDOM').innerHTML;
  282.     //alert('processed HTML:'+txt)
  283.     proxyDgi('proxyDWDOM').innerHTML='';
  284.     //if(txt.search(/OBJECT/)!=-1) alert('pHTML:'+txt+"\n\n"+srcTxt)
  285.     //alert(srcTxt+"\n\n\n"+txt)
  286.     return txt;
  287. }
  288.  
  289. // document.write
  290. function proxyDocumentWrite(txt){document.write(proxyJSProcessHTML(txt))}
  291. function proxyDocumentWriteln(txt){document.writeln(proxyJSProcessHTML(txt))}
  292.  
  293. // Eval
  294. function proxyEval(script){
  295.     //eval(proxyProcessJS(script));
  296.     try{eval(proxyProcessJS(script))} catch(err){/*alert('proxyEval error'); alert(script)*/}
  297. }
  298. // setTimeout
  299. function proxySetTimeout(script,timeout){setTimeout(proxyProcessJS(script),timeout)}
  300. // setInterval
  301. function proxySetInterval(script,timeout){setInterval(proxyProcessJS(script),timeout)}
  302.  
  303. // window.open
  304. function proxyWindowOpen(url,a,b){window.open(proxyEncodeURL(url),a,b)}
  305.  
  306. // Watch document.location modifications
  307. function watchProxyDocumentLocation(){
  308.     if(!proxyDgi('proxyDocumentLocationNode')){
  309.         //document.write('<div id="proxyDocumentLocation" style="display:none"></div>')
  310.         if(!document.body) return;
  311.         var proxyDocumentLocationNode=document.createElement("input");
  312.         proxyDocumentLocationNode.setAttribute("id","proxyDocumentLocationNode");
  313.         proxyDocumentLocationNode.setAttribute("style","display:none");
  314.         document.body.appendChild(proxyDocumentLocationNode);
  315.     }
  316.     var proxyNURL=proxyDgi('proxyDocumentLocationNode').value+"";
  317.     if(!proxyNURL) return;
  318.  
  319.     if(proxyNURL.substr(0,baseURLProxy.length)==baseURLProxy) document.location=proxyNURL;
  320.     else document.location=proxyEncodeURL(proxyNURL);
  321.     proxyDgi('proxyDocumentLocationNode').value='';
  322. }
  323.  
  324. /**
  325.  * document.location replacement
  326.  */
  327. function proxyDocumentLocation(url){
  328.     this.href=String(url);
  329.     this.port='';
  330.     this.protocol=url.substr(0,url.indexOf('://'));
  331.     this.hash='';
  332.     this.pathname='';
  333.     this.search='';
  334.     url=url.substr(url.indexOf('://')+3);
  335.     if(url.indexOf(':')!=-1 && (url.indexOf('/')==-1 || url.indexOf(':')<url.indexOf('/'))){
  336.         this.host=url.substr(0,url.indexOf(':'));
  337.         if((url.indexOf('/')==-1)){this.port=url.substr(url.indexOf(':')+1);url='';}
  338.         else{this.port=url.substring(url.indexOf(':')+1,url.indexOf('/'));url=url.substr(url.indexOf('/'));}
  339.     }
  340.     else{
  341.         if(url.indexOf('/')==-1){this.host=url;url=''}
  342.         else{this.host=url.substr(0,url.indexOf('/'));url=url.substr(url.indexOf('/'));}
  343.     }
  344.     this.hostname=this.domain=this.host;
  345.     if(url.indexOf('#')!=-1){
  346.         this.hash=url.substr(url.indexOf('#'));
  347.         url=url.substr(0,url.indexOf('#'));
  348.     }
  349.     if(url.indexOf('?')!=-1){
  350.         this.search=url.substr(url.indexOf('?'));
  351.         url=url.substr(0,url.indexOf('?'));
  352.     }
  353.     this.pathname=url;
  354. }
  355. // Document.location functions
  356. proxyDocumentLocation.prototype.toString=function(){return this.href}
  357. proxyDocumentLocation.prototype.reload=function(){document.location.reload()}
  358. proxyDocumentLocation.prototype.replace=function(url){document.location.replace(proxyEncodeURL(url))}
  359. proxyDocumentLocation.prototype.anchor=function(a){return this.href.anchor(a)}
  360. // String functions
  361. proxyDocumentLocation.prototype.big=function(){return this.href.big()}
  362. proxyDocumentLocation.prototype.blink=function(){return this.href.blink()}
  363. proxyDocumentLocation.prototype.bold=function(){return this.href.bold()}
  364. proxyDocumentLocation.prototype.charAt=function(a){return this.href.charAt(a)}
  365. proxyDocumentLocation.prototype.charCodeAt=function(a){return this.href.charCodeAt(a)}
  366. proxyDocumentLocation.prototype.concat=function(a){return this.href.concat(a)}
  367. proxyDocumentLocation.prototype.fixed=function(){return this.href.fixed()}
  368. proxyDocumentLocation.prototype.fontcolor=function(a){return this.href.fontcolor(a)}
  369. proxyDocumentLocation.prototype.fontsize=function(a){return this.href.fontsize(a)}
  370. proxyDocumentLocation.prototype.indexOf=function(a,b){return this.href.indexOf(a,b)}
  371. proxyDocumentLocation.prototype.italics=function(){return this.href.italics()}
  372. proxyDocumentLocation.prototype.lastIndexOf=function(a,b){return this.href.lastIndexOf(a,b)}
  373. proxyDocumentLocation.prototype.link=function(a){return this.href.link(a)}
  374. proxyDocumentLocation.prototype.match=function(a){return this.href.match(a)}
  375. proxyDocumentLocation.prototype.slice=function(a,b){return this.href.slice(a,b)}
  376. proxyDocumentLocation.prototype.small=function(){return this.href.small()}
  377. proxyDocumentLocation.prototype.split=function(a,b){return this.href.split(a,b)}
  378. proxyDocumentLocation.prototype.strike=function(){return this.href.strike()}
  379. proxyDocumentLocation.prototype.sub=function(){return this.href.sub()}
  380. proxyDocumentLocation.prototype.substr=function(a,b){return this.href.substr(a,b)}
  381. proxyDocumentLocation.prototype.substring=function(a,b){return this.href.substring(a,b)}
  382. proxyDocumentLocation.prototype.sup=function(){return this.href.sup()}
  383. proxyDocumentLocation.prototype.toLowerCase=function(){return this.href.toLowerCase()}
  384. proxyDocumentLocation.prototype.toUpperCase=function(){return this.href.toUpperCase()}
  385.  
  386. var watchProxyDocumentLocationInt=window.setInterval("watchProxyDocumentLocation()",100);
  387.  
  388. /**
  389.  * document.location replacement
  390.  */
  391.  
  392. function proxyDocument(){
  393.     this.location = siteHref;
  394. }
  395. proxyDocument.prototype.write=function(a){proxyDocumentWrite(a)}
  396. proxyDocument.prototype.writeln=function(a){proxyDocumentWriteln(a)}
  397.  
  398. /**
  399.  * Cookies management
  400.  */
  401.  
  402. // Clear remaining cookies
  403. function proxyClearCookie(){
  404.     var cookies=document.cookie.split('; ');
  405.     //for(var i=0;i<cookies.length;i++) document.cookie=cookies[i]+'; expires='+proxyDateExpire;
  406.     for(var i=0;i<cookies.length;i++) if(cookies[i].substr(0,12)=='proxyCookie')
  407.         document.cookie=cookies[i].substr(0,cookies[i].indexOf(':'))+'=0; expires='+proxyDateExpire;
  408. }
  409. proxyClearCookie();
  410.  
  411. // Get cookies list
  412. function proxyGetCookie(value){return proxyCookies}
  413.  
  414. // Set/unset/modify a cookie
  415. function proxySetCookie(value){
  416.     var expires=0;
  417.     // Determine if an expire date is set
  418.     if(value.indexOf(';')!=-1){
  419.         var tail=value.substr(value.indexOf(';')+1).trim();
  420.         if(tail.substr(0,8)=='expires=') expires=tail.substr(8).trim();
  421.         value=value.substr(0,value.indexOf(';'));
  422.     }
  423.     if(value.indexOf('=')==-1) return;
  424.     var name=value.substr(0,value.indexOf('='));
  425.     value=value.substr(value.indexOf('=')+1).trim();
  426.     if(value.indexOf(';')!=-1) value=value.substr(0,value.indexOf(';'));
  427.  
  428.     // Check if this cookie is present
  429.     var cookies=proxyCookies.split('; ');
  430.  
  431.     proxyCookies='';
  432.     // Remove this new or updated cookie from js cookies list
  433.     for(var i=0;i<cookies.length;i++){
  434.         if(cookies[i].substr(0,name.length+1)!=name+'=') proxyCookies+='; '+cookies[i];
  435.     }
  436.     // Then add it to js cookies list
  437.     if(!expires || new Date(expires)>new Date) proxyCookies+='; '+name+'='+value;
  438.     proxyCookies=proxyCookies.substr(1);
  439.  
  440.     // Add it to real cookies to send it to browser
  441.     document.cookie='proxyCookie'+name+'=expires/'+((expires)?(Date.parse(expires)/1000):'session')+'/'+value;
  442. }